//
//  NSArray+Save.m
//  MsgTest
//
//  Created by Tianlong on 2017/9/12.
//  Copyright © 2017年 Tianlong. All rights reserved.
//

#import "NSArray+Save.h"
#import <objc/runtime.h>
#import "NSObject+Runtime.h"

@implementation NSArray (Save)
//
//+ (void)load{
//    static dispatch_once_t onceToken;
//    dispatch_once(&onceToken, ^{
//        @autoreleasepool {
//            /** 不可变数组 */
//            //空
//            [objc_getClass("__NSArray0") swizzleMethod:@selector(objectAtIndex:) withMethod:@selector(emptyObjectAtIndex:)];
//
//            //非空
//            [objc_getClass("__NSArrayI") swizzleMethod:@selector(objectAtIndex:) withMethod:@selector(anyObjectAtIndex:)];
//
//            /** 可变数组 */
//            [objc_getClass("__NSArrayM") swizzleMethod:@selector(objectAtIndex:) withMethod:@selector(mutableObjectAtIndex:)];
//            [objc_getClass("__NSArrayM") swizzleMethod:@selector(insertObject:atIndex:) withMethod:@selector(mutableInsertObject:atIndex:)];
//            [objc_getClass("__NSArrayM") swizzleMethod:@selector(addObject:) withMethod:@selector(mutableAddObject:)];
//
//            /** 只有一个元素 */
//            //数组中只有一个元素
//            [objc_getClass("__NSSingleObjectArrayI") swizzleMethod:@selector(objectAtIndex:) withMethod:@selector(singleObjectIndex:)];
//            [objc_getClass("__NSSingleObjectArrayI") swizzleMethod:@selector(insertObject:atIndex:) withMethod:@selector(singleInsertObject:atIndex:)];
//            [objc_getClass("__NSSingleObjectArrayI") swizzleMethod:@selector(addObject:) withMethod:@selector(singleAddObject:)];
//
//            /** 类方法创建的数组,插入空时,下面这两个会崩溃 */
//            [objc_getClass("__NSPlaceholderArray") swizzleMethod:@selector(initWithObjects:count:) withMethod:@selector(swizzInitWithObjects:count:)];
//        }
//    });
//}
//
//#pragma mark - 不可变
///**
// 空:nil 或 count = 0
// */
//- (id)emptyObjectAtIndex:(NSInteger)index{
//    return nil;
//}
//
///**
// 多个元素
// */
//- (id)anyObjectAtIndex:(NSInteger)index{
//    if (index >= self.count || index < 0) {
//        return nil;
//    }
//    id obj = [self anyObjectAtIndex:index];
//    if ([obj isKindOfClass:[NSNull class]]) {
//        return nil;
//    }
//    return obj;
//}
//
//#pragma mark - 两个类方法引起的崩溃
///**
// arrayWithObject
// arrayWithObjects:nil count:1
// */
//-(id)swizzInitWithObjects:(const id [])objects count:(NSUInteger)cnt{
//    for (int i=0; i<cnt; i++) {
//        if (objects == NULL){
//            return nil;
//        }
//        if (objects[i] == nil){
//            return nil;
//        }
//    }
//    return [self swizzInitWithObjects:objects count:cnt];
//}
//
//#pragma mark - 可变数组
///**
// 取值
// */
//- (id)mutableObjectAtIndex:(NSInteger)index{
//    if (index >= self.count || index < 0) {
//        return nil;
//    }
//    id obj = [self mutableObjectAtIndex:index];
//    if ([obj isKindOfClass:[NSNull class]]) {
//        return nil;
//    }
//    return obj;
//}
//
///**
// 插入
// */
//- (void)mutableInsertObject:(id)object atIndex:(NSUInteger)index{
//    if (object) {
//        [self mutableInsertObject:object atIndex:index];
//    }else{
//        [self mutableInsertObject:[NSNull null] atIndex:index];
//    }
//}
//
//-(void)mutableAddObject:(id)object{
//    if (object) {
//        [self mutableAddObject:object];
//    }else{
//
//        [self mutableAddObject:[NSNull null]];
//    }
//}
//
//
//#pragma mark - 数组中只有一个元素时三个方法不分可变和不可变
///**
// 取值
// */
//- (id)singleObjectIndex:(NSInteger)index{
//    if (index >= self.count || index < 0) {
//        return nil;
//    }
//    id obj = [self singleObjectIndex:index];
//    if ([obj isKindOfClass:[NSNull class]]) {
//        return nil;
//    }
//    return obj;
//}
//
///**
// 插入
// */
//- (void)singleInsertObject:(id)object atIndex:(NSUInteger)index{
//    if (object) {
//        [self singleInsertObject:object atIndex:index];
//    }else{
//        //数组中有一个元素时,判断下真实类型,如果是NSArray,则不添加
//        Class superClass = self.superclass;
//        NSString *superClassStr = NSStringFromClass(superClass);
//        if (![superClassStr isEqualToString:@"NSArray"]) {
//            [self singleInsertObject:[NSNull null] atIndex:index];
//        }else{
//        }
//    }
//}
//
//-(void)singleAddObject:(id)object{
//    if (object) {
//        [self singleAddObject:object];
//    }else{
//        //数组中有一个元素时,判断下真实类型,如果是NSArray,则不添加
//        Class superClass = self.superclass;
//        NSString *superClassStr = NSStringFromClass(superClass);
//        if (![superClassStr isEqualToString:@"NSArray"]) {
//            [self singleAddObject:[NSNull null]];
//        }else{
//        }
//    }
//}
@end

